package com.yeren.Calendar;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class CalendarDemo {

	/**
	 * 1.Calendar用于操作时间的API
	 * 2.java.util.Calendar类用于封装日历信息，
	 * 	   其主要作用在于其方法可以对时间分量进行运算
	 * 3.Calendar抽象类，其具体子类针对不同国家的日历系统，其中应用最广泛的是
	 *   通常我们使用格里高利历法（公历），对应世界上绝大多数国家/地区使用的标准日历系统。
	 * @author Administrator
	 *
	 */
	public static void main(String[] args) {
//		fun1();
//		fun2();
//		fun3();
//		fun4();
//		fun5();
		fun6();
	}

	private static void fun1() {
		/**
		 * java.util.Calendar 根据当前系统的地区创建对应的子类实现 默认创建的日历类表示的日期为当前系统时间
		 */
		/*
		 * Calendar内部表示一个时间
		 * 默认创建出来的Calendar表示 当前系统时间
		 */
		/*
		 * getInstance方法
		 * 1.Calendar提供了一个类方法getInstance，
		 *   以获取此类型的一个通用的对象
		 * 2.Calendar的getInstance方法返回一个Calendar对象，
		 *   其日历字段已由当前日期和时间初始化
		 */
		Calendar calendar=Calendar.getInstance();
		// Calendar cal=new GregorianCalendar();
		/*
		 * Calendar的toString是不可读的
		 */
		
		//输出Calendar对象所属的实际类型
		System.out.println(calendar.getClass().getName());
		
		System.out.println(calendar);
		/*
		 * 输出结果：
		 * java.util.GregorianCalendar
		 * java.util.GregorianCalendar[time=1408948900786
		 * ,areFieldsSet=true,areAllFieldsSet=true,
		 * lenient=true,zone=sun.util.calendar.ZoneInfo
		 * [id="Asia/Shanghai",offset=28800000,dstSavings=0
		 * ,useDaylight=false,transitions=19,lastRule=null]
		 * ,firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1
		 * ,YEAR=2014,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=5
		 * ,DAY_OF_MONTH=25,DAY_OF_YEAR=237,DAY_OF_WEEK=2
		 * ,DAY_OF_WEEK_IN_MONTH=4,AM_PM=1,HOUR=2,HOUR_OF_DAY=14
		 * ,MINUTE=41,SECOND=40,MILLISECOND=786,ZONE_OFFSET=28800000
		 * ,DST_OFFSET=0]
		 */
	}

	private static void fun2() {
		/**
		 * 将Calendar转成Date Calendar.getTime() 将Calendar描述的时间转换为一个Date对象。
		 */
		Calendar calendar = Calendar.getInstance();
		Date date = calendar.getTime();
		SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
		String dataStr=format.format(date);
		// 输出后转换后的字符串
		System.out.println(dataStr);// 13-11-14 20:24:59
	}

	private static void fun3() {
		/**
		 * Calendar提供了一个set方法，可以对某个时间分量设置给定的值
		 * 时间分量使用Calendar提供的若干常量
		 * @author Administrator
		 */
		Calendar calendar=Calendar.getInstance();
		SimpleDateFormat format = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
		/*
		 * 2008-08-08 
		 * 若设置时间单位对应的值会影响没有被设置的值，那么该值也会对应改变的
		 * 就好比，我们设置了年月日，那么对应的周几也会跟着改变
		 */
		calendar.set(Calendar.YEAR,2008);
		calendar.set(Calendar.MONTH,7);	//月份从0开始，0表示1月，11表示12月
	
		/*
		 * YEAR         年份的字段
		 * MONTH        月份的字段
		 * DATE         一个月份中的第几天
		 * DAY_OF_MONTH 通常说的“号”
		 * DYA_OF_YEAR  年中的第几天
		 * DYA_OF_WEEK  通常说的星期几
		 */
		calendar.set(Calendar.DAY_OF_MONTH, 8);
		//HOUR_OF_DAY 24小时制的小时
		/*
		 * 当设置的单位对应的值超过了该单位允许的最大值时，Calendar会自动进位。
		 * 像这里，小时就会向上进位为天
		 */
		calendar.set(Calendar.HOUR_OF_DAY, 30);
		calendar.set(Calendar.MINUTE, 22);
		calendar.set(Calendar.SECOND, 55);
//		calendar.set(Calendar.DAY_OF_WEEK, 1);//星期改变，日期也改变
		Date date=calendar.getTime();
		String dateStr = format.format(date);
		System.out.println(dateStr);//Sat Aug 09 06:22:55 CST 2008
		
	}

	private static void fun4() {
		Calendar calendar = Calendar.getInstance();
		/**
		 * 获取Calendar的某个时间单位上的值
		 */
		int year = calendar.get(Calendar.YEAR);
		int dayofYear = calendar.get(Calendar.DAY_OF_YEAR);
		System.out.println("现在是" + year + "年的第" + dayofYear + "天");//现在是2016年的第208天

		/**
		 * 想查看一下今年一共多少天
		 */
		calendar.set(Calendar.MONTH, 11);
		calendar.set(Calendar.DATE, 31);//DATE 与 DAY_OF_MONTH功能一致
		int MAX = calendar.get(Calendar.DAY_OF_YEAR);
		System.out.println(year + "年有" + MAX + "天");// 2016年有366天
	}

	private static void fun5() {
		/**
		 * 获取某一天时间分量的最大值 若最大值是固定的，通常我们不会调用该方法
		 */
		Calendar calendar=Calendar.getInstance();
		//今天总共多少天：查看年中的天的最大值
		/*
		 * getActualMaximum方法：
		 * int getActualMaximum(int field)
		 * 给定此Calendar的时间值，返回指定日历字段可能拥有的最大值
		 */
		int days=calendar.getActualMaximum(Calendar.DAY_OF_YEAR);
		System.out.println("总共："+days+"天");//总共：365天
		//当前月最大的天数：月底是几号
		int days1=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		System.out.println("月底是："+days1+"号");//月底是：31号
	}
	
	private static void fun6(){
		Calendar calendar=Calendar.getInstance();
		 /*
		  * add方法:
		  * void add(int field,int mount)
		  * 为给定的时间分量的值加上给定的值，若给定的值为负则是减去给定的值
		  */
		//加3年
		calendar.add(Calendar.YEAR, 3);
		//加2个月
		calendar.add(Calendar.MONTH, 2);
		//减去30天
		calendar.add(Calendar.DAY_OF_YEAR, -30);//对天的加减只用：DAY_OF_YEAR
		System.out.println(calendar.getTime());//Mon Sep 25 19:18:23 CST 2017
	}

}
